package com.lz.common.utils;

import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;

import java.lang.annotation.Annotation;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

//获取所有被指定注解标记的请求 URL 列表。
public class ReqMapperUtil {
    /**
     * 获取所有被指定注解标记的请求 URL 列表。
     * 该方法会遍历所有的请求映射，检查处理方法及其所在类是否被指定注解标记，
     * 若被标记，则将对应的请求 URL 添加到结果列表中。
     *
     * @param annotation 要检查的注解的 Class 对象，用于指定需要匹配的注解类型
     * @return 被指定注解标记的请求 URL 列表，如果没有匹配的则返回空列表
     */
    public static List<String> getAnonymousAccessUrls(Class<? extends Annotation> annotation) {

        RequestMappingHandlerMapping handlerMapping = SpringUtil.getBean(RequestMappingHandlerMapping.class);

        Map<RequestMappingInfo, HandlerMethod> handlerMethods = handlerMapping.getHandlerMethods();

        List<String> collect = handlerMethods.entrySet().stream().filter(entry -> {
                    HandlerMethod handlerMethod = entry.getValue();
                    // 检查方法是否有 @AnonymousAccess 注解
                    boolean methodHasAnnotation = handlerMethod.getMethodAnnotation(annotation) != null;
                    // 检查类是否有 @AnonymousAccess 注解
                    boolean classHasAnnotation = handlerMethod.getBeanType().getAnnotation(annotation) != null;
                    return methodHasAnnotation || classHasAnnotation;
                }).flatMap(entry -> entry.getKey().getPatternsCondition().getPatterns().stream())
                .collect(Collectors.toList());
        return collect;
    }
}
